package com.zf.elasticsearch.entity;

import lombok.Data;
import org.elasticsearch.common.geo.GeoPoint;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.*;

import java.time.LocalDateTime;

/**
 * @author Zhou Feng
 */
@Data
@Document(indexName = "article") // 指定索引名称，标识文档属于哪个索引，不存在就创建，存在就更新
public class Article {
    /**
     * 指定 _id, 同时该字段也会作为文档_source部分的内容
     * Repository 中的 byId 操作，是指 _id
     */
    @Id
    private String id;
    /**
     * 标题，文本，使用默认分词器，
     * 指定 FieldType.Text 则创建的索引Mapping中 该字段不会产生 fields 部分，导致使用 title.keyword 关键字时无法查出结果
     * <pre>
     * {@code
     * "title" : {
     *           "type" : "text",
     *           "fields" : {
     *             "keyword" : {
     *               "type" : "keyword",
     *               "ignore_above" : 256
     *             }
     *           }
     *         },
     * }
     * </pre>
     */
    // @Field(type = FieldType.Text)
    private String title;
    /**
     * 内容，文本，使用默认分词器
     */
    @Field(type = FieldType.Text)
    private String content;
    /**
     * 分类，作为关键字，不分词
     */
    @Field(type = FieldType.Keyword)
    private String category;
    /**
     * 阅读量, 整数
     */
    @Field(type = FieldType.Integer)
    private Integer readCount = 0;
    /**
     * 用户 id, 整数
     */
    @Field(type = FieldType.Integer)
    private Integer userId;
    /**
     * 创建时间
     * 时间默认在es中为毫秒时间戳，最好指定类型为 FieldType.Date，否则在后续的使用中会遇到很多问题。
     * 如果指定了 字段为 FieldType.Date，那么必须指定格式 format，这里使用自定义格式，填写 pattern。
     * Date 和 LocalDateTime 都可以
     */
    @Field(type = FieldType.Date, format = {}, pattern = "yyyy-MM-dd HH:mm:ss")
    // private Date createTime = new Date();
    private LocalDateTime createTime = LocalDateTime.now();

    /**
     * 经纬度类型
     */
    @GeoPointField
    private GeoPoint location;
}
